/**
 * @file Armor.cpp
 * @author enemy1205 (enemy1205@qq.com)
 * @brief 装甲板类
 * @date 2021-08-16
 *
 */
#pragma once

#include "LightBlob.h"
#include "opencv2/ml/ml.hpp"
#include <eigen3/Eigen/Core>

using namespace cv::ml;
using Eigen::MatrixBase;
extern const ArmorParam A_param;
// 装甲板种类
//enum class ArmorType {
//    SMALL,
//    BIG
//};

class Armor : public Features {
public:
    Armor(Blob_ptr &, Blob_ptr &);

//    inline ArmorType getType() { return this->armor_type; }

    //更新其余在判断装甲板时不需要的信息
    void updateRestInfo() override;

    Features_ptr getSon1_Features() override { return this->blob_lf; }

    Features_ptr getSon2_Features() override { return this->blob_rt; }

//    //设置装甲板类型
//    void setArmorType();

private:
    //判断匹配有效性
    void isValidPairs();
//    int ArmorNum;//装甲板数字
//    cv::Mat ConfrontImg;//正视图
//    ArmorType armor_type;//装甲板类型,移交与计算pnp处
    //左右构造灯条
    Blob_ptr blob_lf;
    Blob_ptr blob_rt;
};

using Armor_ptr = std::shared_ptr<Armor>;

//class ArmorNumClassifier {
//public:
//    ArmorNumClassifier();
//
//    ~ArmorNumClassifier() {};
//
//    void loadModel(string &model_path, Size armorImgSize);
//
//    void train();
//
//    void Label(Mat &, vector<int> &);
//
//    void Predicted(const Mat &);
//
//    void loadImg(const Mat &);
//
//    void getConfrontArmor(Armor_ptr &);
//
//    void getArmorNum(Armor_ptr &);
//
//    inline Mat get_dst() { return warpPerspective_dst; };
//
//    inline Mat get_src() { return warpPerspective_src; };
//
//private:
//    Ptr<SVM> svm;  // svm模型
//    Mat p;        // 载入到SVM中识别的矩阵
//    Size armorImgSize; // SVM模型的识别图片大小（训练集的图片大小）
//    Mat warpPerspective_src; //透射变换的原图
//    Mat warpPerspective_dst; //透射变换生成的目标图
//    Mat warpPerspective_mat; //透射变换的变换矩阵
//    Point2f srcPoints[4];   //透射变换的原图上的目标点 tl->tr->br->bl  左上 右上 右下 左下
//    Point2f dstPoints[4];    //透射变换的目标图中的点   tl->tr->br->bl  左上 右上 右下 左下
//};

//class NumDetect {
//public:
//    NumDetect(const Mat &);
//
//    void Detect(Mat &);
//
//    void getConfrontArmor(Armor_ptr &);
//
//    inline float get_ArmorNum() { return this->result.x; }
//
//    inline float get_confidence() { return this->result.y; }
//
//private:
//    const string model_path = "/home/enemy1205/文档/Vision/21_Vision_NumDetect/model/NumDetect.onnx";
//    Point2f result;
//    Mat warpPerspective_src; //透射变换的原图
//    Mat warpPerspective_dst; //透射变换生成的目标图
//    Mat warpPerspective_mat; //透射变换的变换矩阵
//    Point2f srcPoints[4];   //透射变换的原图上的目标点 tl->tr->br->bl  左上 右上 右下 左下
//    Point2f dstPoints[4];    //透射变换的目标图中的点   tl->tr->br->bl  左上 右上 右下 左下
//};